---
title: 分布式事务解决方案Seata
description: 软件架构设计方法，并不定义软件开发过程
authors: ['wkq']
---
## 分布式事务的理论
如何在分布式的场景中保证多个节点数据的一致性，分布式事务产生的原因是存储资源的分布性。<br/>
所以尽量从设计的角度避免分布式事务的发生，如果实在避免不了，再使用 Seata 去解决。<br/>


### 两阶段提交协议
数据库一致性解决方案
#### 两阶段提交流程
需要数据库提供接口才能支持 数据库作为RM
![](./img/两阶段提交协议.png)
#### 两阶段提交时序图
* 存在同步阻塞的缺陷
* 两阶段协议任意一个节点失败都会导致所有节点回滚。
* 中央事务协调者出现问题，会导致数据不一致的问题
![](./img/两阶段提交协议2.png)
#### 两阶段提交优化
* 增加了询问操作，询问是否可以完成提交，不需要完成真正的事务操作
* 这样可以尽早的发现无法完成的操作，尽早终止行为。
* 增加了超时机制，避免了资源被永久锁定的情况
![](./img/三阶段提交协议.png)


### 基于消息的最终一致性
![](./img/基于可靠性消息投递的最终一致性解决方案.png)
* 利用消息中间件（Rocket、Kafka），实现数据一致性的投递。
* 这里的数据一致性并不要求实时性。
#### RocketMQ事务消息模型
![](./img/RocketMQ事务消息模型.png)

#### 最大努力通知型
![](./img/最大努力通知型.png)
:::tip 数据库事务的ACID特性
单库多个表的情况下事务需要满足的特性

* 原子性 Atomicity
* 一致性 Consistency
* 隔离性 Isolation
* 持久性 Durability
:::
## Seata部署与Nacos整合
### 概述
#### 1、什么是Seata
Seata是阿里开源的一款分布式事务解决方案，致力于提供高性能和简单易用的分布式事务服务。<br/>
SpringCloud Alibaba 一站式的解决方案组件之一。
#### 2、Seata的四种事务模式
Seata目标是打造一站式的分布式事务的解决方案，提供了四种事务模式：
* AT 模式（重点）
* TCC 模式
* Saga 模式
* XA 模式

#### 3、三种角色
在 Seata 的架构中，定义了三种角色<br/>
![](./img/Seata是什么.png)
* TC(Transaction Coordinator，事务协调者)：维护全局和分支事务的状态，驱动全局事务提交或回滚
* TM(Transaction Manager,事务管理器)：定义全局事务的范围：开始全局事务、提交或回滚全局事务
* RM(Resource Manager,资源管理器)：管理分之事务处理的资源，与TC交谈以注册分支事务和报告分支事务的状态，并驱动分支事务提交或回滚

其中，TC 为单独部署的 Seata-Server,TM 和 RM 为嵌入到应用中的 Client 客户端。

#### 4、生命周期
![](./img/事务的生命周期.png)
1. TM 请求 TC 开启一个全局事务。TC 会生成一个 XID 作为该全局事务的编号（XID，会在微服务的调用链中传播，保证将多个微服务的子事务关联在一起。）
2. RM 请求 TC 将本地事务注册为全局事务的分支事务，通过全局事务的 XID 进行关联。
3. TM 请求 TC XID 对应的全局事务是进行提交还是回滚。
4. TC 驱动 RM 们将 XID 对应的本地事务进行提交还是回滚。

## 部署相关

## Seata的四种事务模式介绍
## Seata的AT模式
AT模式是Seata主推的分布式事务解决方案，基于两阶段提交，同样分为三大模块，TM、RM、RC。<br/>
具体执行流程如下图：<br/>
![](./img/AT模式执行流程.png)
